package dm

import (
	"fmt"
	"log"
	"os"
	"path/filepath"

	"github.com/olekukonko/tablewriter"
)

var (
	dm *DatabaseManager
)

func Start(dbName string) {
	var err error
	exePath, err := os.Executable()
	if err != nil {
		fmt.Printf("获取可执行文件路径时出错：%v\n", err)
		return
	}
	exeDir := filepath.Dir(exePath)

	// 创建 DatabaseManager 实例
	dm, err = NewDatabaseManager(filepath.Join(exeDir, "db.db"))
	if err != nil {
		log.Fatal(err)
	}
	defer dm.Close()
	// Init(dbName)
	// 获取命令行参数
	args := os.Args
	argsLen := len(args)
	if argsLen < 2 {
		return
	}

	switch args[1] {
	case "help", "-h":
		help()
	case "list", "-l":
		// 查询所有数据
		list()
	case "add", "-a":
		add(args[1:])
	case "update", "-u":
		update(args[1:])
	case "delete", "-d":
		delete(args[1:])
	default:
		fmt.Println("无效的命令，请输入 'dm help' 以获取帮助信息。")
	}
}

func help() {
	defer os.Exit(0)

	fmt.Println("用法: dm <command> [选项]")
	fmt.Println("命令:")
	fmt.Println("  help, -h    显示帮助信息")
	fmt.Println("  list, -l    查询所有数据")
	fmt.Println("  add, -a     添加数据 (类型 账号 密码)")
	fmt.Println("  update, -u  更新数据 (类型 账号 密码)")
	fmt.Println("  delete, -d  删除数据 (类型1 类型2 ...)")
	fmt.Println()
	fmt.Println("详细说明:")
	fmt.Println("  help, -h        显示该帮助信息")
	fmt.Println("  list, -l        查询数据库中的所有数据")
	fmt.Println("  add, -a         添加数据到数据库，需要提供类型、账号和密码")
	fmt.Println("  update, -u      更新数据库中的数据，需要提供类型、账号和密码")
	fmt.Println("  delete, -d      删除数据库中指定类型的数据，可以删除多个类型，以空格分隔")
}

// 查询数据库中的所有数据
func list() {
	users, err := dm.QueryList()
	if err != nil {
		log.Fatal(err)
	}

	// 创建新的表格写入器
	table := tablewriter.NewWriter(os.Stdout)

	// 设置列的对齐方式
	table.SetColumnAlignment([]int{tablewriter.ALIGN_CENTER, tablewriter.ALIGN_CENTER, tablewriter.ALIGN_CENTER})

	// 设置表头的对齐方式
	table.SetHeaderAlignment(tablewriter.ALIGN_CENTER)

	// 设置表格的列名
	table.SetHeader([]string{"类型", "账号", "密码"})

	// 添加查询结果到表格中
	for _, u := range users {
		row := []string{u.Title, u.UserName, u.PassWord}
		table.Append(row)
	}

	// 打印表格
	table.Render()
}

// 添加数据
func add(data []string) {
	if len(data) != 4 {
		fmt.Println("请输入正确的数据格式 (类型 账号 密码)")
		return
	}
	var err error
	err = dm.Insert(User{
		Title:    data[1],
		UserName: data[2],
		PassWord: data[3],
	})
	if err != nil {
		log.Fatal(err)
	}
}

// 更新数据
func update(data []string) {
	if len(data) != 4 {
		fmt.Println("请输入正确的数据格式 (类型 账号 密码)")
		return
	}
	var err error
	err = dm.Update(User{
		Title:    data[1],
		UserName: data[2],
		PassWord: data[3],
	})
	if err != nil {
		log.Fatal(err)
	}
}

// 删除数据
func delete(data []string) {
	if len(data) < 2 {
		fmt.Println("请输入要删除的类型(用空格分开多个要删除的类型)")
		return
	}
	var err error
	for i, title := range data {
		if i != 0 {
			err = dm.Delete(title)
			if err != nil {
				log.Fatal(err)
			}
		}
	}
}
